package com.xm.look;

/**
 * 双重检查锁定
 *
 * @author xiaoming
 * @date 2021-04-05 11:13
 */
public class DoubleCheckedLockDebug {
    public static void main(String[] args) {
        // 1. 懒汉单例模式
        UnsafeLazyInitialization.getName();

        // 2. 双重检查锁, "聪明"的技巧

        // 3. 基于 volatile 解决
    }

}

// 非线程安全的延迟初始化
// 懒汉单例模式
class UnsafeLazyInitialization {
    private static String name;

/*    public static String getName(){
        if (name == null) {     // 1. A 线程执行
            name = "xiaoming";  // 2. B 线程执行
        }
        return name;
    };
    */

    // 加入同步处理
    public synchronized static String getName(){
        if (name == null) {     // 1. A 线程执行
            name = "xiaoming";  // 2. B 线程执行
        }
        return name;
    };
}

// 双重锁定检查
class DoubleCheckedLocking {
    private static String name;

    // 错误的优化
    public static String getName() {
        if (name == null) {                                 // 4. 第一次检查
            synchronized (DoubleCheckedLocking.class) {     // 5. 枷锁
                if (name == null) {                         // 6. 第二次检查
                    name = "xiaoming";                      // 7. 问题根源出现
                }
            }
        }
        return name;
    }

    // 使用 volatile 关键字解决  JSR-133 内存模型 (jdk 1.5)

    private volatile String volatileName;

    public String getVolatileName() {
        if (volatileName == null) {
            synchronized (DoubleCheckedLocking.class) {
                if (volatileName == null) {
                    volatileName = "Volatile Name";
                }
            }
        }
        return volatileName;
    }


}



